package com.example.demo.controller; // 确认包名
import com.example.demo.model.IoTDataDto;
import com.example.demo.model.IoTData;
import com.example.demo.service.IoTDataService;

import com.example.demo.repository.IoTDataRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.Instant;

import java.util.List;

// @RestController 表明这是一个控制器，它返回的数据会自动转换成 JSON 格式。
@RestController
// @RequestMapping("/api/data") 定义了这个控制器下所有接口的公共路径前缀。
@RequestMapping("/api/data")
public class DataController {

    // @Autowired 注解会自动把 Spring 管理的 IoTDataRepository 实例注入到这里。
    @Autowired
    private IoTDataRepository ioTDataRepository;
 
    @Autowired
    private IoTDataService iotDataService;
    /**
     * API接口一：接收物联网设备上传的数据
     * 访问方式: POST 请求
     * 访问URL: http://localhost:8080/api/data/upload
     */
    @PostMapping("/upload")
    public ResponseEntity<String> uploadData(@RequestBody IoTData data) {
        // @RequestBody 会把请求体中的 JSON 数据自动转换成 IoTData 对象。

        // 为了保证时间的准确性，我们在服务器端设置数据的时间戳。
         data.setServerTimestamp(Instant.now().toString());

        // 使用 repository 的 save 方法将数据存入数据库。
        ioTDataRepository.save(data);

        // 返回一个成功的文本响应。ResponseEntity 可以让我们更灵活地控制返回的状态码和内容。
        return ResponseEntity.ok("数据接收成功！");
    }

    /**
     * API接口二：查询数据库中所有的数据
     * 访问方式: GET 请求
     * 访问URL: http://localhost:8080/api/data/list
     */
    @GetMapping("/list")
    public ResponseEntity<List<IoTData>> getAllData() {
        // 使用 repository 的 findAll 方法查询出所有 IoTData 数据。
        List<IoTData> dataList = ioTDataRepository.findAll();

        // 将查询到的数据列表作为响应返回，Spring Boot 会自动把 List<IoTData> 转换成 JSON 数组。
        return ResponseEntity.ok(dataList);
    }

    /**
     * API接口三：分页查询数据
     * 访问方式: GET 请求
     * 访问URL: http://localhost:8080/api/data/page?page=0&size=10
     * 参数说明:
     * - page: 页码，从0开始
     * - size: 每页大小，默认10
     */
    @GetMapping("/page")
    public ResponseEntity<Page<IoTDataDto>> getDataByPage(Pageable pageable) {
        // 这一行代码简洁而强大。
        // Spring Boot会自动读取并解析 URL 中的 page, size, และ sort 参数，
        // 然后为我们创建一个包含所有正确信息（包括按 serverTimestamp 排序）的 Pageable 对象。
        Page<IoTData> dataPage = ioTDataRepository.findAll(pageable);
        Page<IoTDataDto> dtoPage = dataPage.map(iotDataService::convertToDto);
        return ResponseEntity.ok(dtoPage);
    }
}